メインコンテンツまでスキップ

RBIプロキシの紹介

SOFTCAMP SHIELDGate 隔離ブラウザ連携のための HTTP/HTTPS プロキシサービス


📋 目次

  1. 概要
  2. RBIProxyとは?
  3. 全体アーキテクチャ
  4. 主要構成要素
  5. 動作原理
  6. PACファイル設定
  7. セキュリティメカニズム
  8. REST API
  9. 技術スタック
  10. 使用例

概要

RBIProxyはユーザーの一般的なブラウザトラフィックをSOFTCAMP SHIELDGate 隔離ブラウザ自動接続する中間プロキシサーバーです。

ユーザーは普段通りウェブブラウジングを行いますが、すべてのウェブ接続は隔離された環境(RBI)で実行され、セキュリティの脅威から安全に保護されます。

コアバリュー

  • 透明なセキュリティ: ユーザーエクスペリエンスを損なうことなくセキュリティを強化する(自動リダイレクト)
  • 中央集権的制御: 単一プロキシで全てのウェブトラフィックを中央で制御
  • 簡単な中継構造: URL変換およびSHIELDGate連携のみを実行(複雑なポリシーはSHIELDGateで処理)

RBIProxyとは?

RBI (Remote Browser Isolation)

リモートブラウザ隔離技術は、ユーザーのウェブブラウジングを物理的に隔離されたリモート環境で実行するセキュリティソリューションです。

전통적인 웹 접속:
[사용자 PC] ──→ [인터넷 웹사이트]

악성코드 다운로드 위험
제로데이 공격 노출
피싱 사이트 직접 접속

RBI 적용 후:
[사용자 PC] ──→ [격리된 브라우저] ──→ [인터넷 웹사이트]

악성코드가 격리 환경에서만 실행
사용자 PC는 안전

RBIProxyの役割

RBIProxyはPACフィルタリングを通過したトラフィックをSHIELDGateに変換する中継機です:

🎯 フィルタリング構造

┌──────────────────────────────────────────────────────────────┐
│ PAC 파일 (사용자 PC에서 실행) │
│ "어느 사이트는 프록시 거치고, 어느 건 직접?" │
└────────────┬─────────────────────────────┬───────────────────┘
↓ ↓
[허용 사이트] [차단 사이트]
naver.com example.com
microsoft.com unknown-site.com
내부 IP (192.168.x.x) 기타 모든 사이트
↓ ↓
DIRECT (프록시 안 거침) PROXY 10.14.10.176:9999
↓ ↓
[직접 접속] ┌─────────────────────────────┐
│ RBIProxy 서버 │
│ "URL 변환기" │
└──────┬──────────────────────┘

URL 변환 수행

https://shieldgate.softcamp.co.kr/
gate-proxy?currentTab=true&url=원본URL

HTML 리다이렉트 응답

┌───────────────────────┐
│ 사용자 브라우저가 │
│ 자동으로 이동 │
└──────┬────────────────┘

┌─────────────────┐
│ SHIELDGate │
│ gate-proxy │
└──────┬──────────┘

┌─────────────────┐
│ rb-app │
│ (격리 브라우저) │
└──────┬──────────┘

[실제 웹사이트 접속]

具体的な例

例 1: naver.com に接続 (許可されたサイト)

[사용자] naver.com 입력

[PAC 파일] "naver.com? 어? 너 허용이구나!"

[결정] "그럼 너는 DIRECT"

[결과] naver.com에 바로 접속 ✅ (RBIProxy 안 거침)

例 2: example.com に接続 (ブロック対象サイト)

[사용자] example.com 입력

[PAC 파일] "example.com? 허용 목록에 없네"

[결정] "너는 RBIProxy로 보내"

[RBIProxy] URL 변환
원본: http://example.com

변환: https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=http://example.com

[HTML 리다이렉트 응답]
<meta http-equiv="refresh" content="0;url=변환된URL"/>

[사용자 브라우저] 자동으로 SHIELDGate URL로 이동

[SHIELDGate] gate-proxy가 rb-app(격리 브라우저) 실행

[rb-app] 격리된 환경에서 example.com 접속

[결과] 사용자는 격리 브라우저로 example.com 이용 ✅

全体アーキテクチャ

単純化されたフローチャート

┌─────────────────────┐
│ 사용자 PC │
│ (일반 브라우저) │
│ Chrome / Edge 등 │
└──────────┬──────────┘

│ ① Windows 프록시 설정 (PAC)
│ - 허용 사이트 → DIRECT
│ - 차단 사이트 → PROXY 10.14.10.176:9999

┌─────────────────────┐
│ RBIProxy 서버 │
│ (이 프로젝트) │
│ - URL 변환만 │
└──────────┬──────────┘

│ ② HTML 리다이렉트
│ shieldgate.softcamp.co.kr/
│ gate-proxy?currentTab=true&url=원본URL

┌─────────────────────┐
│ SHIELDGate │
│ (격리 브라우저) │
│ - gate-proxy │
└──────────┬──────────┘

│ ③ rb-app 실행

┌─────────────────────┐
│ rb-app │
│ (격리 브라우저) │
└──────────┬──────────┘

│ ④ 실제 웹사이트 접속

┌─────────────────────┐
│ 인터넷 웹사이트 │
│ example.com 등 │
└─────────────────────┘

┌─────────────────────┐
│ インターネットウェブサイト │
│ example.com など │
└─────────────────────┘

### 상세 데이터 흐름

**중요**: PAC 파일이 1차 필터링을 수행합니다!

┌─────────────────────────────────────────────────────────────────┐
│ ユーザーPC │
│ │
│ [Chrome/Edge] ユーザーがURLを入力
│ ↓ │
│ ┌─────────────────────────────────────────────┐ │
│ │ PACファイル (フィルタリング) │ │
│ │ "このサイトはどこに送る?" │ │
│ └──────────┬──────────────────────────────────┘ │
│ │ │
│ ┌──────┴───────┐ │
│ ↓ ↓ │
│ [許可されたサイト] [ブロック対象] │
│ naver.com example.com │
│ ↓ ↓ │
│ DIRECT PROXY 10.14.10.176:9999 │
│ │
└──────┼──────────────┼──────────────────────────────────────────┘
│ │
↓ │ RBIProxyに渡す
[naver.com] ↓
直接接続 ┌─────────────────────────────────────────────────────────────────┐
│ RBIProxyサーバー │
│ (URL 変換ツール) │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 1. リクエスト受信 (9999ポート) │ │
│ └──────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼───────────────────────────────────────┐ │
│ │ 2. URL 変換 │ │
│ │ 原本:http://example.com │ │
│ │ → │ │
│ │ 変換:https://shieldgate.softcamp.co.kr/ │ │
│ │ gate-proxy?currentTab=true&url=http://example.com│
│ └──────────────────┬───────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼───────────────────────────────────────┐ │
│ │ 3. HTML リダイレクト応答 │ │
│ │ │ │
│ └──────────────────┬───────────────────────────────────────┘ │
│ │ │
└─────────────────────┼────────────────────────────────────────────┘


┌─────────────────────────────┐
│ ユーザーのブラウザが │
│ SHIELDGateに自動的に移動 │
└─────────────┬───────────────┘

┌─────────────────────┐
│ SHIELDGate │
│ gate-proxy │
└──────────┬──────────┘

│ rb-appの実行

┌─────────────────────┐
│ rb-app │
│ (隔離ブラウザ) │
└──────────┬──────────┘

│ 直接インターネット接続

┌─────────────────────┐
│ インターネットウェブサイト │
│ example.com │
└─────────────────────┘

***

## 주요 구성 요소

### 1. Windows PAC (Proxy Auto-Config)

**위치**: 사용자 PC의 Windows 프록시 설정

**역할**: **1차 필터링 - 사이트별로 프록시 사용 여부 결정**

**중요**: PAC 파일이 먼저 판단합니다!
- ✅ **허용 사이트** (naver.com, microsoft.com 등) → `DIRECT` (프록시 안 거침)
- ⚠️ **일반 사이트** (example.com 등) → `PROXY 10.14.10.176:9999` (RBIProxy로)

**예시 PAC 파일** (`pac.js`):

```javascript
function FindProxyForURL(url, host) \{
// 1. SHIELDGate 자체는 DIRECT (무한 루프 방지)
if (dnsDomainIs(host, "shieldgate.softcamp.co.kr") ||
dnsDomainIs(host, "security365.co.kr")) \{
return "DIRECT";
\}

// 2. 허용 사이트 목록 (예외 처리)
if (dnsDomainIs(host, "naver.com") ||
dnsDomainIs(host, "microsoft.com") ||
dnsDomainIs(host, "office365.com")) \{
return "DIRECT"; // ← naver.com? 어? 너 허용이구나! DIRECT!
\}

// 3. 내부 네트워크는 DIRECT
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")) \{
return "DIRECT";
\}

// 4. 기본 규칙: RBIProxy로 보냄
return "PROXY 10.14.10.176:9999"; // ← example.com? 너는 RBIProxy로!
\}

実際の動作:

사용자가 naver.com 입력

PAC: "naver.com? 어? 너 허용이구나!"

PAC: "그럼 너는 DIRECT"

naver.com에 바로 접속 ✅ (RBIProxy 거치지 않음)


사용자가 example.com 입력

PAC: "example.com? 허용 목록에 없네"

PAC: "너는 RBIProxy로 보내" (PROXY 10.14.10.176:9999)

RBIProxy로 전달 → 다음 단계 진행

PACファイルの適用方法:

  1. 手動適用(個別PC):

    • Windows 設定 → ネットワークとインターネット → プロキシ
    • "自動プロキシ設定の使用"を有効にする
    • スクリプトアドレス:http://10.14.10.176:9999/RestAPI/pac.js
  2. GPOの適用(ドメイン一括適用):

    그룹 정책 편집기
    → 사용자 구성 → 기본 설정 → Windows 설정 → 레지스트리
    → HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings
    → AutoConfigURL = "http://10.14.10.176:9999/RestAPI/pac.js"
  3. PACファイルのダウンロード:

    # RBIProxy가 제공하는 PAC 파일
    curl http://10.14.10.176:9999/RestAPI/pac.js -o pac.js

2. RBIProxy サーバー

言語: Go (Golang)
ポート:

  • 9999: プロキシサーバー (メイン機能)
  • 80: REST API サーバー (管理/モニタリング)

デプロイメント: Kubernetes (Dockerコンテナ)

主要な役割: "URL 変換ツール"

PACから送信されたすべてのトラフィックを受け取ってSHIELDGate URL形式に変換します。

┌─────────────────────────────────────────────────────┐
│ RBIProxy 서버 (URL 변환기) │
│ │
│ ① 프록시 요청 수신 (9999 포트) │
│ ↓ │
│ ② URL 변환 │
│ 원본: http://example.com │
│ → │
│ 변환: https://shieldgate.softcamp.co.kr/ │
│ gate-proxy?currentTab=true&url=원본URL │
│ ↓ │
│ ③ HTML 리다이렉트 응답 │
│ <meta http-equiv="refresh" │
│ content="0;url=변환URL"/> │
│ │
└─────────────────────────────────────────────────────┘

コアコード (src/main.go317~320行):

func redirectUrl(url string) string \{
// SHIELDGate 방식: URL을 쿼리 파라미터로 전달
return cfg.RBIProxy.RBI.BaseURL +
"gate-proxy?currentTab=true&url=" + url
\}

実際の変換例:

입력: http://example.com

출력: https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=http://example.com

3. SHIELDGate (隔離ブラウザ)

URL: https://shieldgate.softcamp.co.kr

構成:

  • gate-proxy: ウェブインターフェース (URLを受け取ってrb-appを実行)
  • rb-app: 隔離ブラウザエンジン (実際のウェブサイトへのアクセスとレンダリング)

役割:

  • gate-proxyがURLパラメータを受け取ってrb-app(隔離ブラウザ)を実行
  • rb-appが隔離された環境で実際のウェブサイトをレンダリングする
  • ユーザーに画面のみをストリーミング
  • セキュリティポリシーの適用(ダウンロード/アップロード/コピー制御など)

URL 規約:

https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=<원본URL>

動作方式:

gate-proxy URL로 들어옴

gate-proxy가 url 파라미터 추출

rb-app(격리 브라우저) 실행

rb-app이 실제 웹사이트에 직접 접속

사용자에게 화면 스트리밍

例示:

변환된 URL: https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=http://example.com
→ gate-proxy가 rb-app 실행
→ rb-app이 http://example.com 접속

動作原理

🌟 全体シナリオ: 2つの経路

ユーザーがウェブサイトにアクセスする時PACファイルが最初に判断されるします:

사용자가 URL 입력

┌───────────────────────────────┐
│ PAC 파일 (1차 필터) │
│ "이 사이트 어디로 보낼까?" │
└───────┬───────────────────────┘

┌────┴─────┐
↓ ↓
[허용] [차단]
↓ ↓
DIRECT PROXY
↓ ↓
[끝] [RBIProxy]

[SHIELDGate]

シナリオ A: 許可されたサイト (naver.com)

PACで終わるケース- RBIProxyを経由しない

ステップバイステップの流れ

[Step 1] 사용자가 Chrome에 "naver.com" 입력


[Step 2] PAC 파일 실행 (사용자 PC에서)
function FindProxyForURL(url, "naver.com") \{
if (dnsDomainIs(host, "naver.com")) \{
return "DIRECT"; // ← 여기서 결정!
\}
\}


[Step 3] PAC 판단: "naver.com? 어? 너 허용이구나!"


[Step 4] 결정: "그럼 너는 DIRECT" (프록시 사용 안함)


[Step 5] naver.com에 직접 접속 ✅

결과: RBIProxy, SHIELDGate 모두 거치지 않음

シナリオ B: ブロックされたサイト (example.com)

RBIProxy + SHIELDGateを通過するケース

ステップバイステップの流れ

[Step 1] 사용자가 Chrome에 "example.com" 입력


[Step 2] PAC 파일 실행 (사용자 PC에서)
function FindProxyForURL(url, "example.com") \{
// 허용 목록에 없음
return "PROXY 10.14.10.176:9999"; // ← 여기서 결정!
\}


[Step 3] PAC 판단: "example.com? 허용 목록에 없네"


[Step 4] 결정: "너는 RBIProxy로 보내"


[Step 5] RBIProxy 수신
→ 프록시 요청 수신 (9999 포트)


[Step 6] URL 변환 수행
→ 원본: http://example.com
→ 변환: https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=http://example.com


[Step 7] HTML 리다이렉트 응답 생성
→ <meta http-equiv="refresh" content="0;url=변환URL"/>
→ HTTP 202 Accepted 응답


[Step 8] 사용자 브라우저가 자동으로 SHIELDGate URL로 이동


[Step 9] SHIELDGate gate-proxy가 URL 파라미터 확인
→ url=http://example.com 추출


[Step 10] gate-proxy가 rb-app(격리 브라우저) 실행


[Step 11] rb-app이 격리된 환경에서 example.com 직접 접속


[Step 12] 웹사이트 렌더링 후 사용자에게 화면 스트리밍


[완료] 사용자는 격리 브라우저로 example.com을 안전하게 이용 ✅

シナリオ比較

ステップnaver.com (許可)example.com (ブロック)
PACフィルターDIRECT → 直接接続PROXY → RBIProxyに
RBIProxy通過しないURL 変換 → SHIELDGate へ
最終接続naver.com 直接rb-app(隔離ブラウザ) 経由
セキュリティレベル一般隔離環境
段階数5ステップ12ステップ

PACファイル設定

PACファイルとは?

**PAC (Proxy Auto-Config)**はJavaScriptで書かれたファイルで、ブラウザがどのプロキシを使用するかを動的に決定します。

RBIProxy用PACファイルの作成

RBIProxyは/RestAPI/pac.jsエンドポイントを通じてPACファイルを提供します。

基本PACファイル構造

function FindProxyForURL(url, host) \{
// 1. SHIELDGate 자체는 프록시 우회 (무한 루프 방지)
if (dnsDomainIs(host, "shieldgate.softcamp.co.kr") ||
dnsDomainIs(host, "security365.co.kr") ||
dnsDomainIs(host, "softcamp.co.kr")) \{
return "DIRECT";
\}

// 2. 내부 네트워크 (사설 IP) 우회
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0")) \{
return "DIRECT";
\}

// 3. 특정 도메인 예외 처리
if (dnsDomainIs(host, "microsoft.com") ||
dnsDomainIs(host, "azure.com") ||
dnsDomainIs(host, "office365.com")) \{
return "DIRECT"; // Microsoft 서비스는 프록시 우회
\}

// 4. 기본 규칙: RBIProxy를 통해 프록시
return "PROXY 10.14.10.176:9999";
\}

PACファイルの主要な関数

関数説明例示
dnsDomainIs(host, domain)ドメイン一致確認dnsDomainIs(host, "example.com")
shExpMatch(host, pattern)ワイルドカードパターンマッチングshExpMatch(host, "*.google.com")
isInNet(host, network, mask)IPネットワーク範囲の確認isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")
isPlainHostName(host)ホスト名のみがあるか確認する(ドメインなし)isPlainHostName("localhost")

PACファイルの配布方法

方法 1: RBIProxyから直接配布

RBIProxyは/RestAPI/pac.jsエンドポイントを通じてPACファイルを提供します。

# PAC 파일 접근
http://10.14.10.176:9999/RestAPI/pac.js

Windows プロキシ設定:

  1. 設定 → ネットワークとインターネット → プロキシ
  2. "設定自動検索" OFF
  3. "設定スクリプトの使用" ON
  4. スクリプトアドレス:http://10.14.10.176:9999/RestAPI/pac.js

方法 2: ウェブサーバーでのデプロイ

別のウェブサーバー(Apache、Nginxなど)にPACファイルを配布することもできます。

# Nginx 설정 예시
location /proxy.pac \{
alias /var/www/html/pac.js;
types \{
application/x-ns-proxy-autoconfig pac;
\}
\}

方法 3: GPO (グループ ポリシー オブジェクト) の配布

Active Directory 環境での一括適用:

  1. グループポリシー管理コンソールを開く

  2. 新しいGPOの作成: "RBIProxy PAC設定"

  3. 編集 → ユーザー構成 → 基本設定 → Windows設定 → レジストリ

  4. 新しいレジストリ項目:

    Hive: HKEY_CURRENT_USER
    키 경로: Software\Microsoft\Windows\CurrentVersion\Internet Settings
    값 이름: AutoConfigURL
    값 형식: REG_SZ
    값 데이터: http://10.14.10.176:9999/RestAPI/pac.js

PACファイルの例外処理戦略

1. パフォーマンス最適化: 内部リソース DIRECT

// CDN, 정적 리소스는 직접 접속
if (dnsDomainIs(host, "cdn.jsdelivr.net") ||
dnsDomainIs(host, "cdnjs.cloudflare.com")) \{
return "DIRECT";
\}

2. 互換性: 特定のサービスの回避

// Microsoft 365 서비스는 프록시 우회 (인증 문제 방지)
if (dnsDomainIs(host, "office365.com") ||
dnsDomainIs(host, "sharepoint.com") ||
dnsDomainIs(host, "teams.microsoft.com")) \{
return "DIRECT";
\}

3. セキュリティ: 信頼ドメインのみRBIバイパス

// 회사 내부 시스템은 DIRECT
if (dnsDomainIs(host, "intranet.company.com") ||
dnsDomainIs(host, "erp.company.com")) \{
return "DIRECT";
\}

PACファイルのテスト方法

// 테스트용 PAC 파일에 디버그 로그 추가
function FindProxyForURL(url, host) \{
var result;

if (dnsDomainIs(host, "shieldgate.softcamp.co.kr")) \{
result = "DIRECT";
\} else if (isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0")) \{
result = "DIRECT";
\} else \{
result = "PROXY 10.14.10.176:9999";
\}

// 브라우저 콘솔에 로그 출력 (디버깅 시에만 사용)
alert("URL: " + url + "\nHost: " + host + "\nResult: " + result);

return result;
\}

オンラインPACテスターの活用:

  • PacParserPACファイルのアップロード後のテスト

セキュリティメカニズム

1. TLS MITM (Man-In-The-Middle)

RBIProxyはHTTPSトラフィックを検査するためにMITM手法を使用します。

動作過程

[사용자 브라우저]

│ CONNECT example.com:443

[RBIProxy]

│ ① HTTP/1.0 200 OK 응답
│ ② example.com용 TLS 인증서 동적 발급
│ ③ 사용자와 TLS 핸드셰이크
│ ④ 암호화된 요청 복호화
│ ⑤ URL 확인: https://example.com/page
│ ⑥ 리다이렉트 응답 생성

[사용자 브라우저]

│ 자동으로 SHIELDGate로 이동

[SHIELDGate]

社外証明書のインストールが必須

HTTPS MITMが正常に動作するためには、ユーザーPCがRBIProxyのCA証明書を信頼する必要があります。

証明書のダウンロード:

curl http://10.14.10.176:9999/RestAPI/cert.cer -o rbiproxy_cert.cer

インストール方法:

  1. Windows:

    • rbiproxy_cert.cerダブルクリック
    • "証明書のインストール"をクリック
    • "ローカルコンピュータ"の選択
    • "すべての証明書を次のストレージに保存"信頼できるルート認証機関
    • インストール完了
  2. GPO 一括配布:

    그룹 정책 관리 → 컴퓨터 구성 → Windows 설정 → 보안 설정
    → 공개 키 정책 → 신뢰할 수 있는 루트 인증 기관
    → rbiproxy_cert.cer 추가

2. RBI連携方式

RBIProxyは2つのRBI連携方式をサポートしています:

A. SHIELDGate方式 (現在運用中) ⭐

設定:

RBI_LINK_TYPE: SHIELDGate

コードの位置: src/main.go320行

URL形式:

https://shieldgate.softcamp.co.kr/gate-proxy?currentTab=true&url=http://example.com

処理方式:

  • RBIProxyは単純なURL変換のみを実行
  • 元のURLをクエリパラメータとして渡す
  • セキュリティポリシーはSHIELDGateで処理されます

特徴:

  • シンプルで直感的な構造
  • URLが平文で表示される
  • RBIProxyは中継器の役割のみを果たします
  • SHIELDGateにポリシー管理を委任する

B. DIRECT (JWT)方式 (現在未使用)

設定:

RBI_LINK_TYPE: DIRECT

コードの位置: src/main.go323~342行

URL形式:

https://rbi.custom.co.kr/view?url=<JWT_TOKEN>

JWTトークンの内容(src/main.go 329~339行にハードコーディング):

\{
"ver": "1.0",
"id": "softcamp.co.kr",
"url": "http://example.com",
"policy": \{
"screenmark": "OFF", // 화면 워터마크
"key": "ON", // 키보드 입력 허용
"site": "ON", // 사이트 접근 허용
"dn": "ON", // 다운로드 허용
"up": "ON", // 업로드 허용
"media": "ON", // 미디어 재생 허용
"menu": "ON", // 메뉴 사용 허용
"clip": "ON" // 클립보드 사용 허용
\},
"exp": 1234567890 // 만료 시간 (12시간 후)
\}

特徴:

  • URLがJWTトークンで暗号化される
  • トークンの有効期限設定 (12時間)

制約事項:

  • ⚠️ ポリシーがコードにハードコーディングされているなっています
  • ⚠️ すべてのリクエストに同じポリシーを適用
  • ⚠️ ユーザー別/URL別の異なるポリシーの適用不可
  • ⚠️ ConfigMapや設定ファイルで変更不可
  • 現在の運用環境では使用されていません

方式比較の要約

項目SHIELDGate方式 (運用中)DIRECT (JWT)方式 (未使用)
設定値RBI_LINK_TYPE: SHIELDGateRBI_LINK_TYPE: DIRECT
URL 変換クエリパラメータで平文を渡すJWTトークンによる暗号化
ポリシー処理SHIELDGateで処理JWTトークンに含まれる(ハードコーディング)
政策の柔軟性SHIELDGateで柔軟に管理不可能 (コード修正が必要)
RBIProxyの役割単純中継器URL + ポリシーパッケージング
現在の使用状況✅ 使用中❌ 未使用

なぜSHIELDGate方式を使用するのか?

現在の運用環境分析(ConfigMap 基準):

# build/kube-deploy.yaml
RBI_LINK_TYPE: SHIELDGate # ← 실제 운영 설정
RBI_BASEURL: https://devshieldgate.softcamp.co.kr

SHIELDGate方式を選択する理由:

  1. 単純性:
    • RBIProxyはURL変換のみを実行します (src/main.go320行目)
    • SHIELDGateにセキュリティポリシー管理を完全に委任
    • コード修正なしでSHIELDGateでポリシー変更可能
  2. 保守性:
    • JWT方式のポリシーはsrc/main.go329~339行にハードコーディング
    • ポリシー変更時のコード修正 → ビルド → デプロイが必要
    • SHIELDGate方式はSHIELDGateの設定のみ変更すればいい。
  3. 運用の柔軟性:
    • ユーザー別/グループ別の異なるポリシーの適用はSHIELDGateでの管理
    • RBIProxyはすべてのユーザーに対して同様に動作します
    • 政策変更にRBIProxyの再配布は不要

結論:

  • RBIProxyは**"賢いURL変換器"**役割に集中
  • 複雑な政策管理はSHIELDGateの分担
  • シンプルで安定したアーキテクチャ

3. 無限ループ防止

RBIProxyとSHIELDGate間の無限リダイレクトを防ぐメカニズム:

PACファイルでの防止:

// SHIELDGate 도메인은 DIRECT로 접속 (프록시 우회)
if (dnsDomainIs(host, "shieldgate.softcamp.co.kr")) \{
return "DIRECT"; // 무한 루프 방지
\}

動作原理:

사용자가 example.com 입력

PAC: PROXY → RBIProxy로

RBIProxy: shieldgate.softcamp.co.kr/gate-proxy?url=example.com 으로 리다이렉트

사용자 브라우저가 shieldgate.softcamp.co.kr 접속 시도

PAC: "shieldgate.softcamp.co.kr? DIRECT!" ← 여기서 차단!

shieldgate.softcamp.co.kr에 직접 접속 (RBIProxy 안 거침)

무한 루프 방지 ✅

PACで例外処理を行わない場合:

❌ 무한 루프 발생:
example.com → RBIProxy → shieldgate... → RBIProxy → shieldgate... (반복)

REST API

RBIProxyは管理および監視のためのREST APIを提供します。

1. バージョンとヘルスチェック

エンドポイント: GET /またはGET /ver

curl http://10.14.10.176:9999/ver

応答:

\{
"code": 0,
"msg": "안녕, Hi, こんにちは, 你好, Chào...",
"ver": "1.0.0.5"
\}

用途:

  • サービス動作確認
  • バージョン情報の確認
  • Kubernetes Liveness/Readiness Probe

2. アクティブセッションモニタリング

エンドポイント: GET /sessions

認証:

  • localhostへの接続時に認証は不要
  • 外部接続時にBasic Authが必要です
# Basic Auth 사용
curl -u admin:password http://10.14.10.176:9999/sessions

応答:

\{
"code": 0,
"msg": "",
"total": 2,
"sessions": [
\{
"client": "192.168.1.100:48068",
"req": "GET https://example.com",
"time": "295.508µs"
\},
\{
"client": "192.168.1.101:37988",
"req": "CONNECT secure.example.com:443",
"time": "1.381s"
\}
]
\}

用途:

  • リアルタイムトラフィックモニタリング
  • 性能分析 (リクエスト処理時間)
  • ユーザー接続追跡

3. PACファイルの配布

エンドポイント: GET /RestAPI/pac.js

curl http://10.14.10.176:9999/RestAPI/pac.js

応答: JavaScript PACファイル

用途:

  • ユーザーPCのプロキシ自動設定
  • 中央でPACファイルを管理する

4. 独自証明書の配布

エンドポイント: GET /RestAPI/cert.cer

curl http://10.14.10.176:9999/RestAPI/cert.cer -o rbiproxy_cert.cer

応答: PEM形式のCA証明書

用途:

  • HTTPS MITMのためのプライベート証明書の配布
  • ユーザーPCにインストールして証明書警告を削除

技術スタック

言語とフレームワーク

技術バージョン用途
Go (Golang)1.23.11メイン言語
Alpine Linux3.21.3Docker ベースイメージ
elazarl/goproxy-HTTP/HTTPS プロキシライブラリ

主要な Go パッケージ

rbiproxy/
├── cert/ # TLS 인증서 동적 발급 (MITM)
├── config/ # 설정 파일 로드 (config.yaml, 환경변수)
├── restapi/ # REST API 서버
│ └── core/ # API 핸들러 (version, sessions)
└── main.go # 프록시 서버 메인 로직

外部依存性

  • github.com/elazarl/goproxy: HTTP/HTTPS プロキシエンジン
  • github.com/spf13/viper: 設定ファイル管理
  • dev.azure.com/Security365/go-common:
    • JWTトークンの生成/検証
    • ロガー
    • ユーティリティ

ビルドとデプロイ

Docker イメージのビルド:

docker build -t rbiproxy:latest -f build/Dockerfile .

バージョン管理:

  • build/version.txt: メジャー.マイナー.パッチバージョン
  • build/version-patch.txt: パッチ番号
  • ビルド時に自動的にバージョン情報を挿入

使用例

Case 1: 組織のウェブセキュリティ強化

問題:

  • 従業員が業務中に悪性ウェブサイトにアクセスする
  • ランサムウェア、マルウェアダウンロードの危険
  • フィッシングサイトへのアクセスによるアカウントの盗難

解決:

[모든 직원 PC]
↓ (GPO로 PAC 자동 배포)
[RBIProxy]
↓ (자동 리다이렉트)
[SHIELDGate 격리 브라우저]
↓ (안전한 접속)
[외부 웹사이트]

결과: 악성코드가 격리 환경에서만 실행, 직원 PC는 안전

ケース 2: 特定の部門のみRBIを適用

要件:

  • 開発チームは自由なインターネット使用が必要です (DIRECT)
  • 一般部門はRBIを通じたセキュアアクセス

実装:

// 개발팀 IP 대역
function FindProxyForURL(url, host) \{
var clientIP = myIpAddress();

// 개발팀 IP 대역은 DIRECT
if (isInNet(clientIP, "10.14.20.0", "255.255.255.0")) \{
return "DIRECT";
\}

// 그 외 일반 부서는 RBIProxy 사용
if (/* 예외 조건들 */) \{
return "DIRECT";
\}

return "PROXY 10.14.10.176:9999";
\}

Case 3: 高リスクカテゴリーのみRBI適用

要件:

  • 信頼できるサイト(Microsoft, Google)はDIRECT
  • 未知のサイトにのみRBIを適用

実装:

function FindProxyForURL(url, host) \{
// 신뢰 도메인 리스트
var trustedDomains = [
"microsoft.com", "google.com", "github.com",
"stackoverflow.com", "azure.com"
];

for (var i = 0; i < trustedDomains.length; i++) \{
if (dnsDomainIs(host, trustedDomains[i])) \{
return "DIRECT";
\}
\}

// 기타 사이트는 RBIProxy 경유
return "PROXY 10.14.10.176:9999";
\}

ケース 4: モニタリングおよびログ記録

要件:

  • リアルタイムトラフィックモニタリング
  • ユーザーがどのサイトにアクセスしているかを追跡する

実装:

# 실시간 활성 세션 모니터링
watch -n 2 'curl -s http://10.14.10.176:9999/sessions | jq .'

# 로그 파일 실시간 확인 (Kubernetes)
kubectl logs -f deployment/rbiproxy -n shieldinfo-dev

# 특정 사용자 IP 필터링
kubectl logs deployment/rbiproxy -n shieldinfo-dev | grep "192.168.1.100"

デプロイメントアーキテクチャ

Kubernetes 環境

┌────────────────────────────────────────────────────────────┐
│ Kubernetes Cluster │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Namespace: shieldinfo-dev │ │
│ │ │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ ConfigMap │───→│ Deployment │ │ │
│ │ │ rbiproxy-config │ │ │ │ │
│ │ │ │ │ ┌────────────┐ │ │ │
│ │ │ RBI_BASEURL │ │ │ rbiproxy │ │ │ │
│ │ │ RBI_LINK_TYPE │ │ │ Container │ │ │ │
│ │ │ RBIPROXY_PORT │ │ │ │ │ │ │
│ │ └──────────────────┘ │ │ Port:9999 │ │ │ │
│ │ │ └────────────┘ │ │ │
│ │ └────────┬─────────┘ │ │
│ │ │ │ │
│ │ ┌────────▼─────────┐ │ │
│ │ │ Service │ │ │
│ │ │ rbiproxy │ │ │
│ │ │ │ │ │
│ │ │ Port 80, 9999 │ │ │
│ │ └────────┬─────────┘ │ │
│ └────────────────────────────────────┼────────────────┘ │
│ │ │
│ ┌─────────────────────────────────────▼────────────────┐ │
│ │ Namespace: kube-system │ │
│ │ │ │
│ │ ┌──────────────────────────────────────────────┐ │ │
│ │ │ rke2-ingress-nginx-controller │ │ │
│ │ │ │ │ │
│ │ │ - containerPort.rbiproxy: 9999 │ │ │
│ │ │ - tcp-services ConfigMap 참조 │ │ │
│ │ └───────────────────┬──────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────────────▼──────────────────────────┐ │ │
│ │ │ Service (NodePort/LoadBalancer) │ │ │
│ │ │ Port 9999 외부 노출 │ │ │
│ │ └───────────────────┬──────────────────────────┘ │ │
│ └──────────────────────┼───────────────────────────────┘ │
│ │ │
└─────────────────────────┼─────────────────────────────────────┘

│ NodePort or LoadBalancer

┌───────────────┐
│ 외부 접속 │
│ (사용자 PC) │
└───────────────┘

高可用性構成

マルチレプリカデプロイメント:

spec:
replicas: 3 # 3개 인스턴스 실행
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 최대 1개까지만 동시 다운
maxSurge: 1 # 최대 1개까지 추가 생성

HPA (Horizontal Pod Autoscaler):

# CPU 사용률 기반 자동 스케일링
kubectl autoscale deployment rbiproxy \
--cpu-percent=70 \
--min=2 \
--max=10 \
-n shieldinfo-dev

環境変数

Kubernetes ConfigMapを通じて設定を注入します。

必須環境変数

環境変数例の値説明
RBIPROXY_PORT9999プロキシサービスポート
RBI_BASEURLhttps://shieldgate.softcamp.co.krSHIELDGate サーバーアドレス (末尾に/自動追加されました)
RBI_LINK_TYPESHIELDGate連携方式 (SHIELDGateまたはDIRECT)
TZAsia/Seoulタイムゾーン (ログ時間表示用)

選択環境変数

環境変数デフォルト値説明
LOG_LEVELinfoログレベル (error, warn, info, debug)
RESTAPI_JWT_SECRET_B64自動生成JWT署名シークレット (Base64)

環境変数の優先順位

1순위: 환경변수 (ConfigMap/환경변수)
2순위: config.yaml 파일
3순위: 커맨드라인 플래그

Kubernetesのデプロイ時にConfigMapの環境変数が最優先で適用されます。


パフォーマンスとリソース

リソース要件

環境CPU RequestCPU LimitMemory RequestMemory LimitReplicas
開発/テスト100m500m200Mi512Mi1
小規模運営200m700m300Mi1Gi2
中規模運営500m1000m500Mi2Gi3
大規模運用1000m2000m1Gi3Gi5+

予想処理量

単一インスタンス基準(リソース: 700m CPU, 1Gi メモリ):

  • 同時接続: 約500〜1,000個
  • リクエスト毎秒: 約100~200 req/s
  • 応答時間: 平均10〜50ms(リダイレクトのみ)

実際の性能は次の要因によって異なります:

  • ネットワーク帯域幅
  • SHIELDGateの応答速度
  • TLS ハンドシェイクオーバーヘッド

ボトルネック

  1. TLS MITM: 各HTTPSリクエストごとにハンドシェイクが必要 → CPU使用量の増加
  2. 動的認証書発行: ドメイン別証明書の生成 → メモリ使用量の増加
  3. ログ記録: すべてのリクエストをログに記録するとI/O負荷が増加します

最適化のヒント:

  • ログレベルをwarnまたはerrorを下げる
  • レプリカ数の増加による負荷分散
  • SHIELDGateサーバーと同じネットワークに配置(レイテンシの低減)

ログおよび監視

ログ形式

2026-04-01 15:23:45 [INFO] Local HTTP Request - IP: 192.168.1.100:52341, URL: http://example.com, Method: GET
2026-04-01 15:23:45 [INFO] Local [GET http://example.com] code=200 OK elap=12ms

2026-04-01 15:24:10 [INFO] Local HTTPS CONNECT Request - IP: 192.168.1.100:52342, Host: secure.example.com:443
2026-04-01 15:24:10 [INFO] Local HTTPS Detail - IP: 192.168.1.100:52342, Method: GET, URL: https://secure.example.com/
2026-04-01 15:24:10 [INFO] Local [CONNECT secure.example.com:443] GET https://secure.example.com/ code=200 OK elap=45ms

ログ分類

ログタイプ説明意味
Local HTTP Request一般的なブラウザのHTTPリクエスト受信ユーザーがHTTPサイトに接続を試みる
Local HTTPS CONNECT一般的なブラウザのHTTPS CONNECTリクエストユーザーがHTTPSサイトにアクセスしようとしています
Local HTTPS DetailHTTPS リクエストの実際の内容TLS復号化後に確認されたURL

Prometheus メトリック (今後追加可能)

# 활성 세션 수
rbiproxy_active_sessions_total

# 요청 처리 시간 (히스토그램)
rbiproxy_request_duration_seconds

# 요청 수
rbiproxy_requests_total

# 에러 발생 수
rbiproxy_errors_total\{type="tls|redirect|connection"\}

セキュリティ考慮事項

1. 独自の証明書管理

危険:

  • RBIProxyのCA証明書が漏洩するとMITM攻撃が可能になる
  • 証明書の有効期限切れ時のサービス中断

対応:

  • CA証明書ファイル(proxy_cert.pem, proxy_pkey.pemを安全に保管
  • Kubernetes Secretで管理 (ConfigMapの代わりに)
  • 定期的な証明書の更新(例:毎年)

証明書の再生成:

openssl req -x509 -newkey rsa:4096 \
-keyout proxy_pkey.pem \
-out proxy_cert.pem \
-sha256 -days 3650 -nodes \
-subj "/C=KR/ST=Seoul/O=Security365/CN=RBIProxy" \
-addext "subjectAltName=DNS:RBIProxy"

2. REST API アクセス制御

危険:

  • /sessionsAPIでユーザーのトラフィックを露出可能

対応:

  • Basic Auth 設定必須
  • localhost 外部接続時の認証強制
  • Kubernetes NetworkPolicyによるAPIアクセス制限

Basic Authの設定 (config.yaml):

restapi:
basicAuth:
username: admin
password: strong_password_here

3. 無限ループ防止

危険:

  • PACファイルでSHIELDGateをDIRECTで処理しないと無限ループが発生します

対応:

// PAC 파일에 반드시 포함
if (dnsDomainIs(host, "shieldgate.softcamp.co.kr")) \{
return "DIRECT"; // 프록시 우회
\}

4. 内部ネットワークの隔離

推奨構成:

DMZ:        [RBIProxy] ← 사용자 PC 접근
Internal: [SHIELDGate] ← RBIProxy만 접근 가능

NetworkPolicyの例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: rbiproxy-policy
spec:
podSelector:
matchLabels:
app: rbiproxy
ingress:
- from:
- namespaceSelector:
matchLabels:
name: dmz
ports:
- protocol: TCP
port: 9999

高度な設定

1. 複数のRBIサーバーのサポート

シナリオ: 部署ごとに異なるRBIサーバーを使用

実装方法:

  • RBIProxyを複数展開する(それぞれ異なるRBI_BASEURL設定)
  • PACファイルでIP範囲ごとに異なるプロキシを指定する
function FindProxyForURL(url, host) \{
var clientIP = myIpAddress();

// 개발팀 (10.14.20.0/24) → RBIProxy-Dev
if (isInNet(clientIP, "10.14.20.0", "255.255.255.0")) \{
return "PROXY 10.14.10.100:9999";
\}

// 일반 부서 → RBIProxy-Prod
return "PROXY 10.14.10.176:9999";
\}

2. ホワイトリスト中央管理

現在: PACファイルに例外ドメインをハードコーディング

改善策:

  • 中央管理システム(DB、Redisなど)での例外ドメインリスト管理
  • RBIProxyが動的にロードされる
  • PACファイルをテンプレートとして生成

3. 地域別RBIサーバー分散

シナリオ: 支社ごとに近くのRBIサーバーを使用

function FindProxyForURL(url, host) \{
var clientIP = myIpAddress();

// 서울 본사 (10.14.0.0/16)
if (isInNet(clientIP, "10.14.0.0", "255.255.0.0")) \{
return "PROXY 10.14.10.176:9999"; // 서울 RBIProxy
\}

// 부산 지사 (10.20.0.0/16)
if (isInNet(clientIP, "10.20.0.0", "255.255.0.0")) \{
return "PROXY 10.20.10.50:9999"; // 부산 RBIProxy
\}

return "DIRECT";
\}

FAQ (よくある質問)

Q1: RBIProxyがダウンするとインターネットは使えなくなりますか?

Aはい。プロキシがダウンすると、すべてのウェブ接続が不可能になります。

対応策:

  • 高可用性構成: マルチレプリカデプロイメント (最小2つ)

  • Failover: PACファイルにバックアッププロキシを指定

    // 메인 프록시 실패 시 백업 프록시 사용
    return "PROXY 10.14.10.176:9999; PROXY 10.14.10.177:9999; DIRECT";
  • モニタリング: Prometheus + Grafanaでリアルタイムの状態確認

  • アラーム: Alertmanagerでダウン時に即時通知

Q2: 特定のユーザーにのみRBIを適用できますか?

Aはい。PACファイルでは、IPレンジまたはユーザーごとの分岐が可能です。

function FindProxyForURL(url, host) \{
var clientIP = myIpAddress();

// VIP/임원진은 DIRECT 접속 허용
if (isInNet(clientIP, "10.14.1.0", "255.255.255.0")) \{
return "DIRECT";
\}

// 일반 직원은 RBIProxy 경유
return "PROXY 10.14.10.176:9999";
\}

Q6: ログからどのような情報を確認できますか?

A: 次の情報をログに記録します:

  • クライアントIPアドレス
  • リクエストURLおよびメソッド
  • 応答時間
  • HTTP ステータスコード

個人情報保護:

  • POSTボディはログに記録しません
  • クッキー、Authorizationヘッダーはログに記録しません
  • URLのクエリパラメータはログに記録されます(機密情報を含む可能性があります)

制限事項および既知の問題

1. WebSocketのサポート制限

現象: WebSocket接続が正常に動作しない可能性があります

原因: HTTP Upgrade リクエスト処理未対応

解決: WebSocketを使用するサイトはPAC例外処理

// WebSocket 사용 사이트 예외
if (dnsDomainIs(host, "slack.com") ||
dnsDomainIs(host, "teams.microsoft.com")) \{
return "DIRECT";
\}

2. 一部の認証方式の互換性の問題

現象: クライアント証明書ベースのサイトアクセス不可

原因: MITMプロセスでクライアント証明書が送信されない

解決: 当該サイトをPAC例外処理

3. HTTP/2 と HTTP/3

現在の状態: HTTP/1.1のみ完全サポート

HTTP/2: goproxyライブラリの制約により制限されたサポート

HTTP/3: 未サポート (QUICプロトコル)


関連文書

インストールと運用

  • [構築ガイド](../../内部文書/構築-インストール-運営ガイド/RBI Proxy/RBIProxy構築ガイド.md): Kubernetesデプロイ全体手順
  • [環境変数](../../内部文書/構築-インストール-運用ガイド/RBI Proxy/RBIProxy config.js ガイド.md): ConfigMap 設定詳細
  • main.go コード分析: 内部動作原理

REST API

プロジェクト情報

  • README.md: プロジェクト概要と変更履歴

ライセンスおよびオープンソース

使用中のオープンソース

ライブラリライセンス用途
elazarl/goproxyBSD-3-ClauseHTTP/HTTPS プロキシエンジン
spf13/viperMIT設定ファイル管理

変更履歴

RBIProxyは元々lqqyt2423/go-mitmproxyを基にしているが、elazarl/goproxyに変更されました (v1.0.0.1, 2024-06-11)。

変更理由:

  • より良いHTTPS処理
  • 安定したMITM機能
  • 活発なコミュニティサポート

要約

RBIProxyは:

  • ユーザーPCとインターネットの間の透明なセキュリティ層
  • Windows PACを通じて自動的に適用動作するプロキシ
  • SOFTCAMP SHIELDGateと連携してウェブアクセスを隔離環境に切り替える
  • PACファイルを通じて選択的フィルタリング無限ループ防止のために
  • Kubernetesで簡単にデプロイおよび拡張可能

一行要約:
"PACフィルタリングを通過したトラフィックをSHIELDGateに変換するURL変換プロキシ"


次のステップ

  1. [構築ガイド](../../内部文書/構築-インストール-運用ガイド/RBI Proxy/RBIProxy構築ガイド.md)を参考にして配布
  2. 環境に合わせてPACファイルをカスタマイズする
  3. ユーザーPCにCA証明書をインストール
  4. Windows GPOによるPAC設定の一括配布
  5. モニタリングダッシュボードの構築 (/sessionsAPIの活用)

お問い合わせ:

  • 技術サポート:SOFTCAMP
  • プロジェクト管理: nicejh

最終更新: 2026-04-01